#include"chat_client.hpp"
#include<pthread.h>

int sockfd=-1;
void* sendmesg(void* argv)
{
    char buffer[1024];
    while(true)
    {
        struct sockaddr_in recvsock;
        socklen_t len;
        int ret=recvfrom(sockfd,buffer,sizeof(buffer)-1,0,CONV(&recvsock),&len);
        if(ret<0)
        {
            LOG(ERROR)<<strerror(errno);
        }
        buffer[ret]='\0';
        std::cout<<buffer<<std::endl;
    }
}

//客户端向服务器发送且接收信息
int main(int argc,char*argv[])//命令行参数的格式为：./client 服务器的IP地址 服务器的端口号
{
    if(argc!=3)
    {
        LOG(FATAL)<<"命令行参数错误";
        DIE(1);
    }

    uint16_t port=std::stoi(argv[2]);
    std::string IP=argv[1];

    std::cout<<"IP:"<<IP<<"port"<<port<<std::endl;

    //客户端也要创建socket
    sockfd=socket(AF_INET,SOCK_DGRAM,0);//UDP socket
    if(sockfd<0)
    {
        LOG(FATAL)<<strerror(errno);
    }
    LOG(INFO)<<"socket 创建成功";
    struct sockaddr_in serversock;
    //填充服务器的套接字
    bzero(&serversock,sizeof(serversock));
    serversock.sin_family=AF_INET;
    serversock.sin_addr.s_addr=::inet_addr(IP.c_str());
    serversock.sin_port=::htons(port);

    //创建一个接收信息的线程，主线程负责发消息，线程负责收消息
    pthread_t tid;
    pthread_create(&tid,nullptr,sendmesg,nullptr);
    //客户端不需要绑定socket，因为客户端的端口号应该由OS来分配
    while(true)
    {
        std::string mesg;
        std::getline(std::cin,mesg);
        ssize_t ret=::sendto(sockfd,mesg.c_str(),mesg.size(),0,CONV(&serversock),sizeof(serversock));//发送数据
        if(ret<0)
        {
            LOG(ERROR)<<strerror(errno);
        }
    }

    return 0;
}